Micron Document
Deavmi's coding shack

Node / mirrors / ini / commits / 52d94bc

Commit 52d94bc3c62e1ee6535e4aa322ea60abb8d6ab1d


Parents : 816b98a
Author : Tristan Brice Velloza Kildaire <deavmi@redxen.eu>
Date : 2026-04-19T15:30:15+02:00

Making some progress but still got some bugs

Changes

2 files changed, 100 insertions(+), 37 deletions(-)

M core.go +95 -37

Diff

diff --git a/core.go b/core.go
index 9f63392..9bb37d8 100644
--- a/core.go
+++ b/core.go
@@ -24,6 +24,10 @@ type Ini struct {
sections []*Section
}
+func (i Ini) String() string {
+ return "bnro"
+}
+
// represents a section in
// an INI file
type Section struct {
@@ -115,21 +119,23 @@ func (p *Parser) Parse(rs io.Reader) (*Ini, error) {
p.cs_stk = append(p.cs_stk, c)
} else if r == '[' { // section beginning
- s, e := parseSection(s)
+ s, e := p.parseSection(s)
if e != nil {
return types.Zero[*Ini](), e
}
+ log.Debug("Section derived: %v", s)
s.parent = &p.ini // parent
p.sc_ls = append(p.sc_ls, &s)
}
}
+ log.Info("Done")
return &p.ini, nil
}
-func parseSection(s *bufio.Reader) (Section, error) {
+func (p *Parser) parseSection(s *bufio.Reader) (Section, error) {
var sec Section
@@ -162,9 +168,22 @@ func parseSection(s *bufio.Reader) (Section, error) {
log.Debug("End of key-pairs for section '%s'", sectionName)
break
+ } else if r == ';' { // parse a comment
+ log.Debug("dfssdffsdfd")
+ c, e := parseComment(s)
+ if e != nil {
+ return types.Zero[Section](), e
+ }
+ p.cs_stk = append(p.cs_stk, c)
} else {
// parse a record (we provided &sec for parenting)
rec, e := parseRecord(s, &sec)
+ if e != nil {
+ return types.Zero[Section](), e
+ }
+
+ sec.AppendRecord(rec) // add record
+ log.Debug("Got record: %v", rec)
}
}
@@ -178,13 +197,45 @@ func parseRecord(s *bufio.Reader, sec *Section) (Record, error) {
var keyBuild string
var valueBuild string
- var expectingName bool = true
- var expectingEquals bool = false
- var expectingValue bool = false
+ // parse the key
+ n_s, e := parseString(s, '=')
+ if e != nil {
+ return types.Zero[Record](), e
+ }
+ // TODO: Check `n_s` for alpha-numeric
+ keyBuild = n_s
+
+ // parse the `=`
+ eq, e := parseRune(s)
+ if e != nil {
+ return types.Zero[Record](), e
+ } else if eq != "=" {
+ return types.Zero[Record](), fmt.Errorf("Expected `=` but got `%s`", eq)
+ }
+
+ // parse the value
+ v_s, e := parseString(s, '=')
+ if e != nil {
+ return types.Zero[Record](), e
+ }
+ // TODO: Check `v_s` for alpha-numeric
+ valueBuild = v_s
+
+ // TODO: Add setting of comment IF present
+ var record Record = Record{name: keyBuild, value: valueBuild, parent: sec}
+
+ log.Debug("New record: %v", record)
+
+ return record, nil
+}
+
+// skips all whitespace too
+func parseRune(s *bufio.Reader) (string, error) {
+ var out_r rune
for {
r, sz, e := s.ReadRune()
if e != nil {
- return types.Zero[Record](), e
+ return types.Zero[string](), e
}
// end-of-stream reached
@@ -192,46 +243,53 @@ func parseRecord(s *bufio.Reader, sec *Section) (Record, error) {
break
}
+ if r == ' ' || r == '\t' {
+ continue
+ } else {
+ out_r = r
+ break
+ }
+ }
+ return string(out_r), nil
+}
+
+func parseString(s *bufio.Reader, breaker rune) (string, error) {
+ var strBuildUp = ""
+
+ for {
+ r, sz, e := s.ReadRune()
+ if e != nil {
+ return types.Zero[string](), e
+ }
+
+ // end-of-stream reached
+ if sz == 0 {
+ break
+ }
+
+ // newline is immediate end AND we consume
+ if r == '\n' {
+ break
+ }
+
// whitespace
if r == ' ' || r == '\t' {
- if len(keyBuild) == 0 { // skip before-whitespace
+ if len(strBuildUp) == 0 {
continue
- } else { // if we have build up then space means we have name already
- expectingEquals = true
- expectingName = false
- }
- } else if r == '\n' { // ends record
-
- if len(keyBuild) > 0 && len(valueBuild) > 0 {
- log.Trace("Record completed, %s=%s", keyBuild, valueBuild)
+ } else {
break
- } else if len(keyBuild) > 0 && expectingValue == false {
- return types.Zero[Record](), fmt.Errorf("Got key '%s' but = (premature end)", keyBuild)
- } else if len(keyBuild) > 0 && len(valueBuild) == 0 {
- return types.Zero[Record](), fmt.Errorf("Got key '%s' but no value associated with it", keyBuild)
- }
- } else if r == '=' { // equals sign
- // if we never built any key
- if len(keyBuild) == 0 {
- return types.Zero[Record](), fmt.Errorf("Got key = but never got a left-hand side key")
- } else { // now switch to expecting the value
- expectingName = false
- expectingValue = true
}
+ } else if r == breaker {
+ // rewind it and break out
+ s.UnreadRune()
+ break
} else {
- // if we need to build up the key still
- if expectingName {
- keyBuild += string(r)
- } else if expectingValue {
- valueBuild += string(r)
- }
+ strBuildUp += string(r)
}
}
- // TODO: Add setting of comment IF present
- var record Record = Record{name: keyBuild, value: valueBuild, parent: sec}
-
- log.Debug("New record: %v", record)
+ log.Trace("strBuildUp: %s", strBuildUp)
+ return strBuildUp, nil
}
func parseSection_header(s *bufio.Reader) (string, error) {

diff --git a/core_test.go b/core_test.go
index 6426065..fd6c1b9 100644
--- a/core_test.go
+++ b/core_test.go
@@ -36,6 +36,11 @@ func Test_basic(t *testing.T) {
assertions.AssertNullT(t, e)
ini, e := p.Parse(src)
+ _tl.Debug("e: %v", e)
assertions.AssertNullT(t, e)
_tl.Debug("Created ino: %v", ini)
+
+ _tl.Debug("ini: %v", ini)
+ assertions.AssertEqualsLenT(t, 2, ini.sections)
+
}

Served by rngit 1.5.0 - Generated in 0.08s